package com.lsc.jdbc.demo.unit.testng.paramter.util;

import com.mchange.v2.c3p0.ComboPooledDataSource;

import javax.sql.DataSource;
import java.sql.*;
import java.util.ArrayList;
import java.util.List;

public class JdbcUtils_C3P0 {

    static Connection connection;
    static DataSource dataSource;
    static PreparedStatement preparedStatement;
    static ResultSet resultSet;

    /**
     * 初始化 配置文件
     */
    static {
        dataSource = new ComboPooledDataSource("hanamaki");
    }

    /**
     * 链接数据库
     *
     * @return
     */
    public static Connection getCon() {
        try {
            connection = dataSource.getConnection();
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
        return connection;
    }

    /**
     * 释放资源
     *
     * @param connection
     * @param statement
     * @param resultSet
     * @param preparedStatement
     */
    public static void release(Connection connection, Statement statement, ResultSet resultSet, PreparedStatement preparedStatement) {

        if (connection != null) {
            try {
                connection.close();
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }

        }
        if (statement != null) {
            try {
                statement.close();
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }

        }
        if (resultSet != null) {
            try {
                resultSet.close();
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }

        }

        if (preparedStatement != null) {
            try {
                preparedStatement.close();
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }

        }

    }

    /**
     * 读取数据库中的数据 返回值 为 二维数组
     * @param tableName : 需要查询的表名
     * @param param ： 需要查询的 字段
     * @return
     */
    public static Object[][] getSqlContent(String tableName, Object[] param) {
        Object[][] data = null;
        Connection con = getCon();
        /* 通过 StringBuffer  来 拼接  sql  语句  */
        StringBuffer sql = new StringBuffer();
        /* 获得需要查询 字段参数的长度  */
        int length = param.length;
        sql.append("select ");
        for (int i = 0; i < length; i++) {
            sql.append(param[i]);
            if (param.length - 1 != i) {
                sql.append(",");
            }
        }
        sql.append(" from ").append(tableName);
        try {
            preparedStatement = con.prepareStatement(sql.toString());
            resultSet = preparedStatement.executeQuery();
            ResultSetMetaData metaData = resultSet.getMetaData();
            int columnCount = metaData.getColumnCount();
            /* 定义一个 集合 保存每次 取出 的 一个一维数组 */
            List<String[]> list = new ArrayList<>();
            /* 创建一个 二维数组  来保存 集合中的 每一个 一维数组 */

            while (resultSet.next()) {
                /* 定义一个 一维数组 保存每次 取出 的 行记录 */
                String[] result = new String[columnCount];
                for (int i = 0; i < columnCount; i++) {
                    result[i] = String.valueOf(resultSet.getObject(i + 1));
                }
                list.add(result);
            }

            /* 三角形 */
            data= new Object[list.size()][];

            for (int i = 0; i < list.size(); i++) {
                data[i] = list.get(i);
            }

        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }finally {
            release(con, null, resultSet, preparedStatement);
        }
        return data;

    }


}
